#include <iostream>

// 单例模式——饿汉模式 实例对象在程序启动时就构造
class Singleton{
private:
    // 构造和析构设置成私有 防止在类外创建对象
    Singleton()
    {
        std::cout << "Singleton Init Done..." << std::endl;
    }
    ~Singleton()
    {}

    Singleton(const Singleton &) = delete;             // 删除拷贝构造函数
    Singleton &operator=(const Singleton &) = delete;  // 删除拷贝赋值函数

public:
    // 全局访问点 类外获取对象接口
    static Singleton& GetInstance(){
        return _eton;
    } 

private:
    // 类内静态成员变量 保证实例对象只有一个
    static Singleton _eton;   // 只声明未定义
};
Singleton Singleton::_eton;  // 需要在类外定义


// 单例模式——懒汉模式 首次使用实例对象时才构造
class _Singleton{
private:
    // 析构和构造设置成私有
    _Singleton(){
        std::cout << "_Singleton Init Done..." << std::endl;
    }
    ~_Singleton()
    {}

    _Singleton(const _Singleton &) = delete;            // 删除拷贝构造函数
    _Singleton& operator=(const _Singleton &) = delete;  // 删除拷贝赋值函数

public:
    // 全局访问点
    static _Singleton& GetInstance(){
        // 函数内静态局部对象 只初始化一次且在C++11之后是线程安全的
        // 当很多线程同时第一次调用时 只会有一个线程去创建这个实例对象 创建完后 所有线程拿到的都是同一个对象
        static _Singleton _eton;          
        return _eton;
    }

};


int main()
{
    // Singleton::GetInstance();
    // _Singleton::GetInstance();
    return 0;
}